home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 1 / csmp-v1-182.txt < prev    next >
Text File  |  1992-12-31  |  52KB  |  1,432 lines

  1. C.S.M.P. Digest             Sat, 10 Oct 92       Volume 1 : Issue 182
  2.  
  3. Today's Topics:
  4.  
  5.     Password entry in a dialog
  6.     DLOG stuff....
  7.     Using CODE rescource files
  8.     Moving to the foreground after receiving an 'odoc' from the Finder
  9.  
  10.  
  11.  
  12. The Comp.Sys.Mac.Programmer Digest is moderated by Michael A. Kelly.
  13.  
  14. The digest is a collection of article threads from the internet newsgroup
  15. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  16. regularly and want an archive of the discussions.  If you don't know what a
  17. newsgroup is, you probably don't have access to it.  Ask your systems
  18. administrator(s) for details.  (This means you can't post questions to the
  19. digest.)
  20.  
  21. Each issue of the digest contains one or more sets of articles (called
  22. threads), with each set corresponding to a 'discussion' of a particular
  23. subject.  The articles are not edited; all articles included in this digest
  24. are in their original posted form (as received by our news server at
  25. cs.uoregon.edu).  Article threads are not added to the digest until the last
  26. article added to the thread is at least one month old (this is to ensure that
  27. the thread is dead before adding it to the digest).  Article threads that
  28. consist of only one message are generally not included in the digest.
  29.  
  30. The entire digest is available for anonymous ftp from ftp.cs.uoregon.edu
  31. [128.223.8.8] in the directory /pub/mac/csmp-digest.  Be sure to read the
  32. file /pub/mac/csmp-digest/README before downloading any files.  The most
  33. recent issues are available from sumex-aim.stanford.edu [36.44.0.6] in the
  34. directory /info-mac/digest/csmp.  If you don't have ftp capability, the sumex
  35. archive has a mail server; send a message with the text '$MACarch help' (no
  36. quotes) to LISTSERV@ricevm1.rice.edu for more information.
  37.  
  38. The digest is also available via email.  Just send a note saying that you
  39. want to be on the digest mailing list to mkelly@cs.uoregon.edu, and you will
  40. automatically receive each new issue as it is created.  Sorry, back issues
  41. are not available through the mailing list.
  42.  
  43. Send administrative mail to mkelly@cs.uoregon.edu.
  44.  
  45.  
  46. -------------------------------------------------------
  47.  
  48. From: ptaplin@escher.arch.adelaide.edu.au (Paul Taplin)
  49. Subject: Password entry in a dialog
  50. Date: 29 Jun 92 09:36:00 GMT
  51. Organization: Department of Architecture, University of Adelaide
  52.  
  53. I need to allow password entry into an editText field of a dialog. I'm
  54. wondering if the best way to hide the entered text is to use a font
  55. consisting of 'bullets' (option-8's) only, instead of replacing each
  56. keystroke with the value of a 'bullet'.
  57. Using a font of all bullets would allow me to specify any field as
  58. being hidden data entry, and means that I can let TextEdit do all the
  59. work constructing the strings. If I were to replace the characters as
  60. they were being entered then I'd need to construct strings holding the
  61. actual text (which might be a little complicated should the insertion
  62. point be changed, etc.)
  63. Am I on the right track? Has anyone any suggestions?
  64.  
  65. Thanks,
  66.  
  67. Paul.
  68. - -- 
  69. | Paul Taplin                   Phone: +61 8 228 5836                         |
  70. | Postgrad Student              Fax:   +61 8 223 7239                         |
  71. | Department of Architecture    Email: ptaplin@arch.adelaide.edu.au           |
  72. | University of Adelaide        Postal:GPO box 498,Adelaide SA 5001,Australia |
  73.  
  74. +++++++++++++++++++++++++++
  75.  
  76. From: minow@Apple.COM (Martin Minow)
  77. Date: 29 Jun 92 14:05:45 GMT
  78. Organization: Apple Computer Inc., Cupertino, CA
  79.  
  80.  
  81. ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  82. dialogs.  There are two basic solutions:
  83.  
  84. 1. Create a font with *no* characters and set the "unknown character" to
  85.    "bullet" and use this font to display your text. You can use the
  86.    SetDAFont call to set the font -- but then must create userItems to
  87.    store all static text.
  88. 2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  89.    hide the text in a private record, and substitute the bullet character.
  90.    This is tricky to do if you handle cut/paste.
  91.  
  92. I found that the first solution worked best for me. Note that your
  93. font must have a number in the application-private range. I used 32400
  94. for the FOND/font family, and 32412 for the font id.
  95.  
  96. Good luck.
  97.  
  98. Martin Minow
  99. minow@apple.com
  100.  
  101. +++++++++++++++++++++++++++
  102.  
  103. From: mwalker@wc.novell.com (Mel Walker)
  104. Organization: Novell, Inc. - Walnut Creek
  105. Date: Mon, 29 Jun 1992 16:25:13 GMT
  106.  
  107. In article <69368@apple.Apple.COM> minow@Apple.COM (Martin Minow) writes:
  108. >
  109. >ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  110. >dialogs.  There are two basic solutions:
  111. >
  112. >1. Create a font with *no* characters and set the "unknown character" to
  113. >   "bullet" and use this font to display your text. You can use the
  114. >   SetDAFont call to set the font -- but then must create userItems to
  115. >   store all static text.
  116. >2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  117. >   hide the text in a private record, and substitute the bullet character.
  118. >   This is tricky to do if you handle cut/paste.
  119. >
  120. >I found that the first solution worked best for me. Note that your
  121. >font must have a number in the application-private range. I used 32400
  122. >for the FOND/font family, and 32412 for the font id.
  123. >
  124. >Good luck.
  125. >
  126. >Martin Minow
  127. >minow@apple.com
  128.  
  129. What about spaces? Won't they always print as a space, no matter what the
  130. "unknown character" is in the font? On the DevCD, there was a set of password
  131. routines, one of which used two edit text items in a dialog, one of which
  132. was hidden. It works well, handles spaces, mouse selection, etc.
  133.  
  134. - --
  135. Mel Walker                     "You can't have everything...
  136. mwalker@optics.wc.novell.com         where would you put it?"
  137. Novell Macintosh Test Team              -- Stephen Wright
  138.  
  139. +++++++++++++++++++++++++++
  140.  
  141. From: jcav@quads.uchicago.edu (JohnC)
  142. Date: 29 Jun 92 17:56:44 GMT
  143. Organization: The Royal Society for Putting Things on Top of Other Things
  144.  
  145. In article <69368@apple.Apple.COM> minow@Apple.COM (Martin Minow) writes:
  146. >ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  147. >dialogs.  There are two basic solutions:
  148. >
  149. >1. Create a font with *no* characters and set the "unknown character" to
  150. >   "bullet" and use this font to display your text. You can use the
  151. >   SetDAFont call to set the font -- but then must create userItems to
  152. >   store all static text.
  153.  
  154. Does this mean that the warning on page 230 of IM-I (Font Manager chapter)
  155. no longer applies?  I quote:
  156.  
  157.     WARNING: Every font _must_ have a missing symbol.  The characters
  158.     with ASCII codes 0 (NUL), $09 (horizontal tab), and $0D (Return)
  159.     must _not_ be missing from the font if there's any chance it will
  160.     ever be used by TextEdit;  usually they'll be zero-length, but you
  161.     may want to store a space for the tab character.
  162.  
  163. This seems quite emphatic to me.  I'm concerned in light of the fact that
  164. the Dialog Manager uses TextEdit for all static and editable text items.
  165. What's the scoop?
  166.  
  167. - -- 
  168. John Cavallino                  |  EMail: jcav@midway.uchicago.edu
  169. University of Chicago Hospitals |         John_Cavallino@uchfm.bsd.uchicago.edu
  170. Office of Facilities Management | USMail: 5841 S. Maryland Ave, MC 0953
  171. B0 f++ c+ g+ k s++ e+ h- pv     |         Chicago, IL  60637
  172.  
  173. +++++++++++++++++++++++++++
  174.  
  175. From: Thad.Humphries@p950.f70.n109.z1.fidonet.org (Thad Humphries)
  176. Date: 30 Jun 92 03:16:23 GMT
  177.  
  178.  
  179.   PT> From: ptaplin@escher.arch.adelaide.edu.au (Paul Taplin) Newsgroups:
  180.   PT> 
  181.   PT> I need to allow password entry into an editText field of a dialog. I'm
  182.   PT> wondering if the best way to hide the entered text is to use a font
  183.   PT> consisting of 'bullets' (option-8's) only, instead of replacing each
  184.   PT> keystroke with the value of a 'bullet'....
  185.  
  186. There is an example by a guy from the UK DTS office on the d e v e l o p CD.
  187. He shows three approaches and explains each:  unique font, edit an off screen
  188. text field and paste in bullets on screen, and a 3d I don't recall.  I just this
  189. Saturday did it a 4th way with globals (sorry professor).  I'm sure I can tweak
  190. this down to be a bit more flexible, but at 2AM Sunday morning, ya gets what you
  191. can get.  Here is the dialog filter proc:
  192.  
  193. // For trapping the password and outlining the OK button in the first dialog.
  194. pascal Boolean LoginDLOGFltr( DialogPtr theDialog, EventRecord *event, short
  195. *itemHit )
  196. {
  197.     short    itemKind, radius;
  198.     Handle    itemHandle;
  199.     Rect    itemRect;
  200.     char    key;
  201.     Handle    nameTextHandle, pwTextHandle;
  202.     Str255    nameTextStr, pwTextStr;
  203.     
  204.     GetDItem( theDialog, kNameItem, &itemKind, &nameTextHandle, &itemRect );
  205.     GetDItem( theDialog, kPWItem, &itemKind, &pwTextHandle, &itemRect );
  206.     GetIText( nameTextHandle, &gName );
  207.     GetIText( pwTextHandle, &pwTextStr );
  208.     
  209.     switch ( event ->what ) {
  210.         case keyDown:
  211.         case autoKey:
  212.             key = ( event->message & charCodeMask );
  213.             switch ( key ) {
  214.                 case chReturn:
  215.                 case chEnter:
  216.                     if ( (gName[0] >= kMinLength) && (pwTextStr[0] >= kMinLength) ) {
  217.                         *itemHit = kOKBtn;
  218.                         FlashDialogItem( theDialog, *itemHit );
  219.                     }
  220.                     return TRUE;
  221.                 case chPeriod:
  222.                     if ( event->modifiers & cmdKey ) {
  223.                         *itemHit = kCancelBtn;
  224.                         FlashDialogItem( theDialog, *itemHit );
  225.                         return TRUE;
  226.                     }
  227.                 case chEscape:
  228.                     *itemHit = kCancelBtn;
  229.                     FlashDialogItem( theDialog, *itemHit );
  230.                     return TRUE;
  231.                 case chTab:
  232.                     return FALSE;    // for normal dialog behavior of a tab
  233.                 case chSpace:
  234.                 case chNBSpace:  // non breaking space
  235.                     SysBeep(1);
  236.                     return TRUE;    // no spaces in name or password
  237.                 default:
  238.                     // If we're in the password field...
  239.                     if ( ((DialogPeek)theDialog)->editField + 1 == kPWItem ) {
  240.                         // ... and the user didn't backspace,
  241.                         if ( key != chBkSpace) {
  242.                             if ( pwTextStr[0] == kMaxLength ) {
  243.                                 SysBeep(1);
  244.                                 return TRUE;
  245.                             }
  246.                             // put the key into the password global...
  247.                             gPassword[0] = pwTextStr[0] + 1;
  248.                             gPassword[ pwTextStr[0] + 1 ] = key;
  249.                             // ... and return him a bullet.
  250.                             event->message = chBullet;  // the option-8
  251.                             DialogSelect( event, &theDialog, itemHit);
  252.                         }
  253.                         // If he did backspace in the password field ...
  254.                         else {
  255.                             // ... adjust the password strings ...
  256.                             gPassword[0] = gPassword[0] - 1;
  257.                             // ... and let TextEdit take over.
  258.                             return FALSE;
  259.                         }
  260.                     }
  261.                     // If we're in the name field, process the key normally.
  262.                     else {
  263.                         // Allow for backspacing.
  264.                         if ( key != chBkSpace ) {
  265.                             if ( gName[0] == kMaxLength ) {
  266.                                 SysBeep(1);
  267.                                 return TRUE;
  268.                             }
  269.                             DialogSelect( event, &theDialog, itemHit);
  270.                         }
  271.                         else
  272.                             return FALSE;
  273.                     }
  274.                     return TRUE;
  275.             }
  276.         // Outline the OK button.  From "Macintosh Programming Secrets, 2 ed.", p.
  277. 164.
  278.         case updateEvt:
  279.             SetPort( theDialog );
  280.             GetDItem( theDialog, kOKBtn, &itemKind, &itemHandle, &itemRect );
  281.             InsetRect( &itemRect, -4, -4 );
  282.             radius = ( itemRect.bottom - itemRect.top ) / 2;
  283.             if ( radius > 16 )
  284.                 radius = 16;
  285.             PenNormal();
  286.             PenSize( 3, 3);
  287.             FrameRoundRect( &itemRect, radius, radius );
  288.             return FALSE;
  289.         default:
  290.             return FALSE;
  291.     }
  292.     return FALSE;
  293. }
  294.  
  295. God! He comments his code well!
  296.  
  297. +++++++++++++++++++++++++++
  298.  
  299. From: peter@cujo.curtin.edu.au (Peter N Lewis)
  300. Date: 1 Jul 92 02:53:41 GMT
  301. Organization: NCRPDA, Curtin University
  302.  
  303. In article <69368@apple.Apple.COM>, minow@Apple.COM (Martin Minow) wrote:
  304.  
  305. > 1. Create a font with *no* characters and set the "unknown character" to
  306. >    "bullet" and use this font to display your text. You can use the
  307. >    SetDAFont call to set the font -- but then must create userItems to
  308. >    store all static text.
  309.  
  310. My experience doing this was not so good - no matter what I did to the font
  311. the space character always appeared as a space and never a bullet.  Is it
  312. just me?  Probably :-)
  313.  
  314. > 2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  315. >    hide the text in a private record, and substitute the bullet character.
  316. >    This is tricky to do if you handle cut/paste.
  317.  
  318. Here is some pascal code that will get you started, its by no means
  319. perfect, it doesnt handle cmd-keys, edit menus, moving the window,
  320. outlining the default button or anything else.
  321.  
  322. program Passwords;
  323.  
  324.  const
  325.   ok_item = 1;
  326.   name_item = 2;
  327.   password_item = 3;
  328.  
  329.  procedure Getitemtext (dlg: dialogPtr; item: integer; var s: str255);
  330.   var
  331.    k: integer;
  332.    r: rect;
  333.    h: handle;
  334.  begin
  335.   GetDItem(dlg, item, k, h, r);
  336.   GetIText(h, s);
  337.  end;
  338.  
  339.  var
  340.   dlg, thedlg: dialogPtr;
  341.   theitem: integer;
  342.   quitNow: boolean;
  343.   er: eventRecord;
  344.   name, pass, tes: str255;
  345.   dummy: boolean;
  346.   dest, view: rect;
  347.   teh: TEHandle;
  348.   ch: CharsHandle;
  349. begin
  350.  dlg := GetNewDialog(128, nil, POINTER(-1));
  351.  SetRect(dest, 10, 10, 100, 20);
  352.  view := dest;
  353.  teh := TENew(dest, view);
  354.  repeat
  355.   dummy := WaitNextEvent(everyEvent, er, 10, nil);
  356.   if IsDialogEvent(er) then begin
  357.    if er.what in [keyDown, AutoKey] then
  358.     if dialogPeek(dlg)^.editField + 1 = password_item then begin
  359.      TESetSelect(dialogPeek(dlg)^.textH^^.selStart,
  360. dialogPeek(dlg)^.textH^^.selEnd, teh);
  361.      TEKey(chr(BAND(er.message, charCodeMask)), teh);
  362.      if BAND(er.message, charCodeMask) >= 32 then
  363.       er.message := BAND(er.message, $FFFFFF00) + $A5;
  364.     end;
  365.    if DialogSelect(er, thedlg, theitem) then begin
  366.     if theitem = 1 then
  367.      quitNow := true;
  368.    end;
  369.   end;
  370.  until quitNow;
  371.  GetItemText(dlg, name_item, name);
  372.  GetItemText(dlg, password_item, pass);
  373.  ch := TEGetText(teh);
  374. {$R-}
  375.  tes[0] := chr(teh^^.teLength);
  376.  BlockMove(ptr(ch^), @tes[1], teh^^.teLength);
  377.  TEDispose(teh);
  378.  DisposDialog(dlg);
  379.  ShowText;
  380.  writeln('Name:', name);
  381.  writeln('Password: ', pass);
  382.  writeln('Pass2:', tes);
  383. end.
  384.  
  385. Have fun,
  386.    Peter.
  387.  
  388. _______________________________________________________________________
  389. Peter N Lewis, NCRPDA, Curtin University       peter@cujo.curtin.edu.au
  390. GPO Box U1987, Perth WA 6001, AUSTRALIA             FAX: +61 9 367 8141
  391.  
  392. +++++++++++++++++++++++++++
  393.  
  394. From: dowdy@apple.com (Tom Dowdy)
  395. Date: 2 Jul 92 15:57:59 GMT
  396. Organization: Apple Computer, Inc.
  397.  
  398. In article <69368@apple.Apple.COM>, minow@Apple.COM (Martin Minow) wrote:
  399. > ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  400. > dialogs.  There are two basic solutions:
  401. > 1. Create a font with *no* characters and set the "unknown character" to
  402. >    "bullet" and use this font to display your text. You can use the
  403. >    SetDAFont call to set the font -- but then must create userItems to
  404. >    store all static text.
  405. > 2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  406. >    hide the text in a private record, and substitute the bullet character.
  407. >    This is tricky to do if you handle cut/paste.
  408.  
  409. 3. Install QuickDraw bottlenecks in your dialog for StdText and
  410. StdTextMeas, 
  411. when each character comes through, sub for the '*' character.  The
  412. only difficult part is determining if the thing being drawn or measured
  413. is in the text item you are interested in.
  414.  
  415. You can also use this method for drawing boxes that are the same width
  416. as the characters, or for having a "filling bar" for the password 
  417. (a la MacX).
  418.  
  419.  Tom Dowdy                 Internet:  dowdy@apple.COM
  420.  Apple Computer MS:81KS    UUCP:      {sun,voder,amdahl,decwrl}!apple!dowdy
  421.  20525 Mariani Ave         AppleLink: DOWDY1
  422.  Cupertino, CA 95014       
  423.  "The 'Ooh-Ah' Bird is so called because it lays square eggs."
  424.  
  425. +++++++++++++++++++++++++++
  426.  
  427. From: Meessen@slig.ucl.ac.be (Christophe Meessen)
  428. Date: 3 Jul 92 10:38:39 GMT
  429. Organization: Universite Catholique de Louvain (Belgium)
  430.  
  431. In article <69368@apple.Apple.COM>, minow@Apple.COM (Martin Minow) wrote:
  432. > ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  433. > dialogs.  There are two basic solutions:
  434. > 1. Create a font with *no* characters and set the "unknown character" to
  435. >    "bullet" and use this font to display your text. You can use the
  436. >    SetDAFont call to set the font -- but then must create userItems to
  437. >    store all static text.
  438. > 2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  439. >    hide the text in a private record, and substitute the bullet character.
  440. >    This is tricky to do if you handle cut/paste.
  441.  
  442. I shoosed the second solution. But we get problems if we want to handle
  443. arrow keys, mouse selection, delete key etc. 
  444.  
  445. What I did is creating one editable visible field which has its TEdit
  446. structure.
  447. I created a second TEdit structure but in a rect outside the screen.
  448.  
  449. If a Key dow event occured, I stored the char in the invisible TEdit
  450. structure and stored a bullet in the visible TEdit structure.
  451. Arrow keys and delete keys behaved the same way in both structures.
  452.  
  453. When a mouse down event occured in the visible TEdit structure I just
  454. copyed the cursor position (SetSelection) in the invisible TEdit structure.
  455.  
  456. So what ever event would come next, the both fields would remain
  457. consistent.
  458.  
  459. The resuslt was a real masked password field.
  460.  
  461. This was added to a visible userName field in the same dialog.
  462.  
  463. Hope this idear may help some of you out there. 
  464.  
  465. I can post the source code of my password dialog box module on usnet if
  466. asked.
  467.  
  468. Bien cordialement,
  469.  
  470.                            Christophe MEESSEN
  471.  
  472. +++++++++++++++++++++++++++
  473.  
  474. From: blimoges@sobeco.com (Bertrand Limoges)
  475. Date: 10 Jul 92 13:34:38 GMT
  476. Organization: Sobeco Ernst & Young
  477.  
  478. In article <69368@apple.Apple.COM>, minow@Apple.COM (Martin Minow) wrote:
  479. > ptaplin@escher.arch.adelaide.edu.au asks about putting passwords into
  480. > dialogs.  There are two basic solutions:
  481. > 1. Create a font with *no* characters and set the "unknown character" to
  482. >    "bullet" and use this font to display your text. You can use the
  483. >    SetDAFont call to set the font -- but then must create userItems to
  484. >    store all static text.
  485. > 2. Trap keyboard and edit (cut/paste) events in the ModalDialog filterproc
  486. >    hide the text in a private record, and substitute the bullet character.
  487. >    This is tricky to do if you handle cut/paste.
  488.  
  489. I used the second option, and was inspired by a snippet of code from UMPG,
  490. which I include below. I rewrote it in C, and avoided using a global to
  491. store the actual password by stuffing a handle to the password string in
  492. the dialog's RefCon. All you have to do in your dialog filter is to retrieve
  493. the handle using GetWRefCon.
  494.  
  495. Hope this helps, Bertrand Limoges, Montreal, Canada
  496.  
  497. disclaimer: opinions expressed are definitely my own!
  498.  
  499.  
  500. >From: blob@apple.com (.i.Brian Bechtel;)
  501. Subject: Re:.c2. Password a'la AppleShare (Dialog Filter with code)
  502.  
  503. I kept this code from the last time that this question was asked.
  504. >From: matthews@eleazar.dartmouth.edu (Jim Matthews)
  505. >Subject: Re: suppress display of password entry
  506.  
  507. In article <536@sdacs.ucsd.EDU> wade@sdacs.ucsd.EDU (Wade Blomgren) writes:
  508. >
  509. >What is the best (easiest) way to allow entry of a password on the screen
  510. >while suppressing the display of the actual characters in the 
  511. >edittext item? 
  512.  
  513. It actually isn't very difficult to intercept the key events and keep a hidden copy of the password string.  It isn't necessary to remember any context since you have access to the TextEdit record, and it tells you what the current selection is.  The following routine is a filter for a name/password dialog box.  It displays bullets (ala AppleShare) and stores the real password in a global string, pwStr.  It also handles hitting return or enter.
  514.  
  515. { signonFilter -- dialog filter for doSignon, hides password }
  516.  
  517. FUNCTION signonFilter (dp : DialogPtr;
  518.             VAR theEvent : EventRecord;
  519.             VAR itemHit : integer) : boolean;
  520.     CONST
  521.         nameItem = 3;
  522.         passwordItem = 4;
  523.         bs = $08;
  524.         tab = $09;
  525.         cr = $0D;
  526.         enter = $03;
  527.         larrow = $1C;
  528.         rarrow = $1D;
  529.         uparrow = $1E;
  530.         downarrow = $1F;
  531.     VAR
  532.         dpeek : DialogPeek;
  533.         theChar : char;
  534.         theStr : Str255;
  535.         selStart, selEnd : integer;
  536.         h : Handle;
  537.         itemType : integer;
  538.         box : Rect;
  539. BEGIN
  540.     signonFilter := false;
  541.     dpeek := DialogPeek(dp);
  542.     IF ((theEvent.what = keydown) OR (theEvent.what = autoKey)) THEN
  543.         IF (dpeek^.editField = passwordItem - 1) THEN
  544.         BEGIN
  545.             theChar := char(BitAnd(theEvent.message, charCodeMask));
  546.             selStart := dpeek^.textH^^.selStart;
  547.             selEnd := dpeek^.textH^^.selEnd;
  548.             CASE ord(theChar) OF
  549.                 bs :                { Backspace }
  550.                     BEGIN
  551.                         IF selEnd = selStart THEN  { back over a character }
  552.                         BEGIN
  553.                             IF selStart > 0 THEN
  554.                              pwStr := concat(copy(pwStr,1, selStart - 1),
  555.                                                   copy(pwStr, selStart + 1,
  556.                                                    length(pwStr) - selStart));
  557.                         END
  558.                         ELSE            { delete the selection }
  559.                             pwStr := concat(copy(pwStr, 1, selStart),
  560.                              copy(pwStr, selEnd + 1,
  561.                                    length(pwStr) - selEnd));
  562.                     END;
  563.                 cr, enter :     { Return or Enter -- treat as "OK }
  564.                     BEGIN
  565.                         itemHit := ok;
  566.                         signonFilter := true;
  567.                     END; { cr, enter }
  568.                 tab, uparrow, downarrow, rarrow, larrow :
  569.                     ;     { just pass on tabs & arrows }
  570.                 OTHERWISE   { "normal" character }
  571.                     BEGIN        { remember character, insert a bullet }
  572.                         pwStr := concat(copy(pwStr, 1, selStart),
  573.                          theChar,
  574.                          copy(pwStr, selEnd + 1, length(pwStr) - selEnd));
  575.                         theEvent.message :=
  576.                          BitAnd(theEvent.message, $FFFFFF00) + ord('%');
  577.                     END; { normal character }
  578.             END; { case ord(theChar) of }
  579.         END { in password field }
  580.         ELSE     { not in password field -- still check for cr, enter }
  581.             CASE BitAnd(theEvent.message, charCodeMask) OF
  582.                 cr, enter :
  583.                     BEGIN
  584.                         itemHit := ok;
  585.                         signonFilter := true;
  586.                     END; { cr, enter }
  587.                 OTHERWISE
  588.                     ;
  589.             END; { case BitAnd }
  590. END; { signonFilter }
  591.  
  592.  
  593. - --Brian Bechtel     blob@apple.com     "My opinion, not Apple's"
  594.  
  595.  
  596. +++++++++++++++++++++++++++
  597.  
  598. From: zben@ni.umd.edu (Charles B. Cranston)
  599. Date: 10 Jul 92 23:06:19 GMT
  600. Organization: UM Home for the Terminally Analytical
  601.  
  602. There's a somewhat simpler approach in chapter 10 of the
  603. Macintosh Progamming Secrets second edition book.  It involves
  604. keeping a second shadow TERec and doing something like this:
  605.  
  606. /* If keydown or autokey and not return or enter */
  607.  
  608.    key = theEvent->message & charCodeMask;
  609.  
  610.    if (key > kSpace) {
  611.       theEvent->message &= ~charCodeMask;
  612.       theEvent->message |= kBullet;
  613.    }
  614.  
  615.    dialogTE = ( (DialogPeek) theDialog )->textH;
  616.    (*pMirrorEditText)->selStart = (*dialogTE)->selStart;
  617.    (*pMirrorEditText)->selEnd = (*dialogTE)->selEnd;
  618.    TEKey(key,pMirrorEditText);
  619.  
  620. It then returns false so the modified event (made into bullet)
  621. gets applied to the dialog's textedit but the real keystroke
  622. gets applied to the pMirrorEditText textedit.  So the real
  623. password is in pMirrorEditText at the end...
  624.  
  625. +++++++++++++++++++++++++++
  626.  
  627. From: Meessen@slig.ucl.ac.be  (Christophe Meessen)
  628. Organization: Universite Catholique de Louvain (Belgium)
  629. Date: Wed, 15 Jul 1992 09:48:31 GMT
  630.  
  631. In article <1992Jul10.230619.27268@ni.umd.edu>, zben@ni.umd.edu (Charles B.
  632. Cranston) wrote:
  633. > There's a somewhat simpler approach in chapter 10 of the
  634. > Macintosh Progamming Secrets second edition book.  It involves
  635. > keeping a second shadow TERec and doing something like this:
  636. > /* If keydown or autokey and not return or enter */
  637. >    key = theEvent->message & charCodeMask;
  638. >    if (key > kSpace) {
  639. >       theEvent->message &= ~charCodeMask;
  640. >       theEvent->message |= kBullet;
  641. >    }
  642. >    dialogTE = ( (DialogPeek) theDialog )->textH;
  643. >    (*pMirrorEditText)->selStart = (*dialogTE)->selStart;
  644. >    (*pMirrorEditText)->selEnd = (*dialogTE)->selEnd;
  645. >    TEKey(key,pMirrorEditText);
  646. > It then returns false so the modified event (made into bullet)
  647. > gets applied to the dialog's textedit but the real keystroke
  648. > gets applied to the pMirrorEditText textedit.  So the real
  649. > password is in pMirrorEditText at the end...
  650.  
  651. This is how I did. Glad to hear that it was suggested in Knaster's
  652. Macintosh Progamming Secrets. 
  653.  
  654. Your code is not complete. May be a sumary ? 
  655.  
  656. I suggest the following more specific description.
  657.  
  658.  
  659. The main idear is to have a shadow TEdit record beside the password
  660. editable field. I call them 'passwdTEHdl' and 'shadowTEHdl'.
  661.  
  662. You need access to 'passwdTEHdl' and 'shadowTEHdl' to be able to handle
  663. mouseEvt correctly. So instead of using a modal dialog in which I have no
  664. access to the 'passwdTEHdl', I had to work with a non modal dialog with my
  665. own event loop.  You'll see later why.
  666.  
  667. The 'passwdTEHdl' destRect and viewRect is set to the field rect, and the
  668. 'shadowTEHdl' destRect and viewRect is set to a same size rect but outside
  669. the dialog portRect.
  670.  
  671. As in AppleShare, a LoginName field is associated to the password field. So
  672. we have two visible editable fields. The field in which the next typed char
  673. will be added is called the active field. We thus have a 'loginNameTEHdl'
  674. and an 'activeField' variable telling if the active field is the
  675. passwdField or the loginNameField.
  676.  
  677. To switch the active field from 'loginNameTEHdl' to 'passwdTEHdl' or
  678. reverse we will use the tabKey or the mouse click. 
  679.  
  680. Now to handle the events it's simple, we will use the following method
  681.  
  682. switch( theEvent.what ){
  683.  
  684. case autoKey:
  685. case keyDown:
  686.     <handle key down or autoKey event>
  687.  
  688. case mouseDown:
  689.     <handle mouse down event>
  690.  
  691. case updateEvt:
  692.     <handle update event>
  693. }
  694.  
  695. Look at <handle key down or autoKey event> first.
  696. This may be expressed like this:
  697.  
  698. key = (char)theEvent.message;
  699.  
  700. < handle default button keyboard shortcuts here >
  701.  
  702. if( activeField == loginNameField ){
  703.    if( key == tabKey ) {
  704.         TEDeactivate( loginNameTEHdl );
  705.         TEActivate( passwdTEHdl );
  706.         activeField = passwdField;
  707.     } else {
  708.        if( loginNameFilter( key ) ) 
  709.             TEKey( key, loginNameTEHdl );
  710.         else
  711.             SysBeep( 1 );
  712.     }
  713. } else {
  714.    if( key == tabKey ) {
  715.         TEDeactivate( passwdTEHdl );
  716.         TEActivate( loginNameTEHdl );
  717.         activeField = LoginNameField;
  718.     } else {
  719.        if( passwdFilter( key ) ) {
  720.            TEKey( key, shadowTEHdl );
  721.            if( key > kSpace )
  722.                key = kBullet;
  723.            TEKey( key, passwdTEHdl );
  724.         } else 
  725.             SysBeep( 1 );
  726.     }
  727. }
  728.  
  729. You may filter the key passed for loginName or passwd with the
  730. loginNameFilter or the passwdFilter function returning true if the key is
  731. accepted as valid and keep the edited string in a valid length. 
  732.  
  733.  
  734. Now let us <handle mouse down event>. We will first test in wich field the
  735. user clicked. Then change the active field if required. And finaly, handle
  736. the click.
  737.  
  738. A click in the password field requires to track the click on passwdTEHdl
  739. which has the bullets and is the visible string. This is impossible to do
  740. in a modal dialog. So this is the reason why I had to work with  a non
  741. modal dialog.
  742.  
  743. GlobalToLocal( &theEvent.where );
  744.  
  745. if( ! PtInRect( theEvent.where, &theDialog.portRect ) ) {
  746.     SysBeep( 1 );
  747.     break;
  748. }
  749.  
  750. < handle button click here >
  751.  
  752. extend = (theEvent.modifiers & shiftKey) == shiftKey;
  753.  
  754. if( PtInRect( theEvent.where, &loginNameRect ) ) {
  755.    if( activeField == passwdField ) {
  756.        TEDeactivate( passwdTEHdl );
  757.        TEActivate( loginNameTEHdl );
  758.        activeField = loginNameField;
  759.    } 
  760.    TEClick( theEvent.where, extend, loginNameTEHdl );
  761. }
  762.  
  763. if( PtInRect( theEvent.where, &passwdRect ) ) {
  764.    if( activeField == loginNameField ) 
  765.        TEDeactivate( loginNameTEHdl );
  766.        TEActivate( passwdTEHdl );
  767.        activeField = passwdField;
  768.    }
  769.    TEClick( theEvent.where, extend, passwdTEHdl );
  770.    TESetSelect( (*(TEPtr *)passwdTEHdl)->selStart,
  771.                 (*(TEPtr *)passwdTEHdl)->selEnd, shadowTEHdl );
  772. }
  773.  
  774.  
  775. BTW, this way of handling passwd input has another advantage. In modal
  776. dialog with more then one editable fields, when a field becomes inactive,
  777. the field string is drawn one point higher. The reason for this is another
  778. debate. But now we can avoid this feature.
  779.  
  780.  
  781. To <handle update event>, nothing is simpler,
  782.  
  783. BeginUpdate( theDialog );
  784.  
  785. DrawDialog( theDialog );
  786.  
  787. < frame default button here >
  788.  
  789. PenSize( 1, 1 );
  790.  
  791. EraseRect( &loginNameRect );
  792. FrameRect( &loginNameRect );
  793. TEUpdate( &loginNameRect , loginNameTEHdl );
  794.  
  795. EraseRect( &passwdRect );
  796. FrameRect( &passwdRect );
  797. TEUpdate( &passwdRect, passwdTEHdl );
  798.  
  799. EndUpdate( theDialog );
  800.  
  801.  
  802.  
  803.  
  804. Bien cordialement,
  805.  
  806.                            Christophe MEESSEN
  807.  
  808. +++++++++++++++++++++++++++
  809.  
  810. From: de19@umail.umd.edu (Dana S Emery)
  811. Date: 24 Jul 92 08:13:28 GMT
  812. Organization: Personal
  813.  
  814. In article <28473@goofy.Apple.COM>, dwb@apple.com (David W. Berry) wrote:
  815.  
  816. > Simplest approach I've seen is to create a FONT with nothing but bullet's
  817. > in it and use it for the font for the TERec.  Saves all kind's of hassles
  818. > and kludges and works almost anywhere.
  819.  
  820. Unfortunatly, spaces are not printed from the FONT/NFNT, so they will not
  821. echo as a bullet. I discovered this the hard way while developing a 'show
  822. invisibles' capability, and decided to use sicns for the invisibles in
  823. stead of a private font.  Since some passwords allow space as a character,
  824. this is not a foolproof technique.
  825.  
  826. - --
  827.  
  828. Dana S Emery <de19@umail.umd.edu>
  829.  
  830. +++++++++++++++++++++++++++
  831.  
  832. From: dwb@apple.com (David W. Berry)
  833. Date: 17 Jul 92 21:05:07 GMT
  834. Organization: Greenwing Enterprises
  835.  
  836. In article <1992Jul10.230619.27268@ni.umd.edu> Charles B. Cranston,
  837. zben@ni.umd.edu writes:
  838. >There's a somewhat simpler approach in chapter 10 of the
  839. >Macintosh Progamming Secrets second edition book.  It involves
  840. >keeping a second shadow TERec and doing something like this:
  841. >
  842. Simples approach I've seen is to create a FONT with nothing but bullet's
  843. in it and use it for the font for the TERec.  Saves all kind's of hassles
  844. and kludges and works almost anywhere.
  845.  
  846. ---------------------------
  847.  
  848. From: jedwards@gmuvax2.gmu.edu (James Edwards)
  849. Subject: DLOG stuff....
  850. Organization: George Mason University, Fairfax, Va.
  851. Date: Thu, 16 Jul 1992 15:09:31 GMT
  852.  
  853. This is probably too simple, but I haven't been able to get it to work.
  854. I have an about box for my program is entirely filled with a picture
  855. item.  I want to put the continue button on top of the picture, but when
  856. I do it, you can't select it, and the program is stuck.  I tried
  857. renumbering the items so that it was drawn after the picture, but that
  858. didn't work either.  Do I have to emulate a button, and just check for
  859. the mouse click in a certain RECT?  Or is there an elegant way to do
  860. this?  Thanks in advance!
  861.  
  862. Jimi
  863.  
  864.  
  865. +++++++++++++++++++++++++++
  866.  
  867. From: iscjcw@uccvma.ucop.edu (Jerry Wilcox)
  868. Date: 16 Jul 92 17:34:39 GMT
  869. Organization: University of California
  870.  
  871. In article <1992Jul16.150931.27139@gmuvax2.gmu.edu> jedwards@gmuvax2.gmu.edu
  872. (James Edwards) writes:
  873. >This is probably too simple, but I haven't been able to get it to work.
  874. >I have an about box for my program is entirely filled with a picture
  875. >item.  I want to put the continue button on top of the picture, but when
  876. >I do it, you can't select it, and the program is stuck.  I tried
  877. >renumbering the items so that it was drawn after the picture, but that
  878. >didn't work either.  Do I have to emulate a button, and just check for
  879. >the mouse click in a certain RECT?  Or is there an elegant way to do
  880. >this?  Thanks in advance!
  881. >
  882. >Jimi
  883. >
  884. >
  885. I don't know how elegant it is, but I put up my About dialogs from a routine
  886. which does its own event loop, and I clear the dialog and return to my main
  887. event loop when any key is pressed or when the mouse is clicked anywhere on the
  888. screen.
  889.  
  890. ***********************************************************************
  891. * Hey! If UC wanted me to speak for it - I'd have a different job!    *
  892. *   Jerry Wilcox, IS&C, UC Office of the President, Oakland, CA       *
  893. * iscjcw@uccvma.ucop.edu === iscjcw@uccvma.bitnet === CIS 72760,2401  *
  894. ***********************************************************************
  895.  
  896. +++++++++++++++++++++++++++
  897.  
  898. From: scott@mcl.ucsb.edu (Scott Bronson)
  899. Date: 19 Jul 92 07:53:45 GMT
  900.  
  901. I like to make the DITL for the DLOG consist of only one item: a PICT
  902. resource that covers the entire dialog.  Make sure the item is enabled.
  903. Then, your about code looks like this (clean and concise):
  904.  
  905.             dp = GetNewDialog( 131, nil, (WindowPtr)-1L );
  906.             if( dp ) ModalDialog( nil, &i );
  907.             DisposeDialog( dp );
  908.  
  909. Dunno why more people don't use this technique...  If you want to be fancy,
  910. you might pass a filterProc that will check for hitting keys to dismiss
  911. the dialog also --  but that's left as an excersice for the reader.
  912.  
  913.     - Scott
  914.  
  915. 6000 dollars of Macintosh Mayhem nearly destroyed by 25 cents of milk.
  916.  
  917. +++++++++++++++++++++++++++
  918.  
  919. From: John Lacey <johnl@spinner.cs.indiana.edu>
  920. Organization: Computer Science, Indiana University
  921. Date: Sun, 19 Jul 1992 21:20:54 -0500
  922.  
  923. scott@mcl.ucsb.edu (Scott Bronson) writes:
  924.  
  925. > I like to make the DITL for the DLOG consist of only one item: a PICT
  926. > resource that covers the entire dialog.  Make sure the item is enabled.
  927. > [...]
  928. > Dunno why more people don't use this technique...  If you want to be fancy,
  929. > you might pass a filterProc that will check for hitting keys to dismiss
  930. > the dialog also --  but that's left as an excersice for the reader.
  931.  
  932. This is nearly my favorite method as well.  I make sure everything is
  933. *disabled*, and write a filter proc that returns
  934.  
  935.     theEvent->what == mouseDown || theEvent->event == keyDown
  936.  
  937. Strictly, it is not necessary that everything be disabled.  From what
  938. I have seen, from others and disassembling applications, this *is* a
  939. pretty popular way to do this.
  940.  
  941. P.S.  For what it's worth, I have come to standard windows for the
  942. about box.  Makes it less obtrusive, and makes the ambiguity and
  943. inconsistency of dismissing the splash screen a non-issue.
  944.  
  945. - -- 
  946. John Lacey        ``What's wrong with my style is not a lack of expressiveness
  947.                     or lucidity, but vulgarity.''                --G. H. Hardy
  948.  
  949. +++++++++++++++++++++++++++
  950.  
  951. From: scott@mcl.ucsb.edu (Scott Bronson)
  952. Date: 22 Jul 92 05:30:28 GMT
  953.  
  954. In <scott.711532425@mcl> scott@mcl.ucsb.edu (Scott Bronson) writes:
  955.  
  956. >I like to make the DITL for the DLOG consist of only one item: a PICT
  957. >resource that covers the entire dialog.  Make sure the item is enabled.
  958. >Then, your about code looks like this (clean and concise):
  959.  
  960. >            dp = GetNewDialog( 131, nil, (WindowPtr)-1L );
  961. >            if( dp ) ModalDialog( nil, &i );
  962. >            DisposeDialog( dp );
  963.  
  964. >Dunno why more people don't use this technique...  If you want to be fancy,
  965. >you might pass a filterProc that will check for hitting keys to dismiss
  966. >the dialog also --  but that's left as an excersice for the reader.
  967. I'll tell you why more people don't use my EXACT technique.  It's
  968. got a glaring bug that I didn't notice until just now.  I'm suprised
  969. no one else on the net caught me doing this.
  970.  
  971. Do you see the bug?  The above code should read:
  972.  
  973.            dp = GetNewDialog( 131, nil, (WindowPtr)-1L );
  974.            if( dp ) {
  975.                ModalDialog( nil, &i );
  976.                DisposeDialog( dp );
  977.            }
  978.  
  979.  
  980. A rather embarassed...
  981.  
  982.     - Scott
  983.  
  984. +++++++++++++++++++++++++++
  985.  
  986. From: ewylie@ocf.berkeley.edu (Elizabeth Wylie)
  987. Date: 22 Jul 92 20:24:24 GMT
  988. Organization: U. C. Berkeley Open Computing Facility
  989.  
  990. >In <scott.711532425@mcl> scott@mcl.ucsb.edu (Scott Bronson) writes:
  991. >Do you see the bug?  The above code should read:
  992. >
  993. >           dp = GetNewDialog( 131, nil, (WindowPtr)-1L );
  994. >           if( dp ) {
  995. >               ModalDialog( nil, &i );
  996. >               DisposeDialog( dp );
  997. >           }
  998. >
  999. >
  1000. >A rather embarassed...
  1001. >
  1002. >    - Scott
  1003.  
  1004. Don't feel so bad Scott, you would have never been burned anyway.  Page 413 of
  1005. Inside Mac has a warning stating:
  1006.  
  1007. "If either the dialog template resource or the item list cannot be read, the function result is undefined."
  1008.  
  1009. I have never gotten nil as a result from GetNewDialog.  As far as I know, Apple hasn't bothered to fix the call yet.  Paranoid programmers (like myself) put
  1010. envelope routines around GetNewDialog and Alert.  The routine reads in both
  1011. the DITL and DLOG (or ALRT) resource and makes sure they're non-purgeable.
  1012.  
  1013. Then it calls GetNewDialog.  Window centering code that observes the system 7 flags under systm 6 can be inserted here as well.
  1014.  
  1015. Anybody out there know why apple likes to make our lives just a bit more interesting by not retuning error codes for the above routines and being so wierd about
  1016. GetResource ?  It really pisses me off.
  1017.  
  1018. Hat to ramble, but my newsposter won't allow me to type less than I quote.
  1019.  
  1020. piss.
  1021.  
  1022. - -E Wylie
  1023. .
  1024.  
  1025. ---------------------------
  1026.  
  1027. From: kamprath@caen.engin.umich.edu (Michael Kamprath)
  1028. Subject: Using CODE rescource files
  1029. Date: Thu, 16 Jul 92 14:31:03 EDT
  1030. Organization: University of Michigan
  1031.  
  1032. I would like to be able to build CODE rescource files, and then load them
  1033. by my program in order to evaluate some data.  I am using THINK C 5.0.
  1034. The THINK manual describes how to write a CODE rescource, but not how
  1035. to employ it.  
  1036.  
  1037. What I want my program to be able to do: The user open a CODE file containing
  1038. the function they wish to use, the program then pass the function some
  1039. data, and the function (in theCODE rescource) return a result.  The reason I
  1040. want to do this is because I want the user to be able to write the function
  1041. that the program uses.
  1042.  
  1043. Thanks for any help
  1044.  
  1045. Michael Kamprath
  1046. kamprath@caen.engin.umich.edu
  1047.  
  1048.  
  1049. +++++++++++++++++++++++++++
  1050.  
  1051. From: oster@well.sf.ca.us (David Phillip Oster)
  1052. Organization: Whole Earth 'Lectronic Link
  1053. Date: Thu, 23 Jul 1992 08:50:23 GMT
  1054.  
  1055. Use think C to build a resourc with code in it, say type 'mCod'm id = 128.
  1056. if it has a main procedure
  1057. pascal vvoid main(short verb, long *result, ListHandle lh);
  1058.  
  1059. then you call it form your main program with:
  1060.     Handle    h;
  1061.     SignedByte    state;
  1062.     long        res;
  1063.  
  1064.     if(NIL != (h = GetResource('mCod', 128))){
  1065.         state = HGetState(h);
  1066.         HLock(h);
  1067.         CallPascal( 3, &res, lh, *h);
  1068.         HSetState(h, state);
  1069.     }
  1070. For a main that is a C procedure, say:
  1071. typedef void (*CodeResType_)(short verb, long *result, ListHandle lh);
  1072.  
  1073. then, instead of the CallPascal line above, say:
  1074. (* (CodeResType) *h)( 3, &res, lh);
  1075.  
  1076. ---------------------------
  1077.  
  1078. From: greeny@top.cis.syr.edu (J. S. Greenfield)
  1079. Subject: Moving to the foreground after receiving an 'odoc' from the Finder
  1080. Date: 20 Jul 92 23:53:34 GMT
  1081. Organization: Syracuse University, CIS Dept.
  1082.  
  1083.  
  1084. What is the standard technique to insure that your application is in the
  1085. foreground after receiving an 'odoc' event from the finder?
  1086.  
  1087. I have an application (which does not recieve suspend/resume events) which
  1088. brings up a custom get file after receiving an 'odoc' event.  If there are
  1089. some finder windows open, the get file dialog will occasionally appear
  1090. *behind* the finder windows, initially.  It then moves to the front, but
  1091. the dialog window is left empty.
  1092.  
  1093. Can anyone provide me with references to relevant portions of IM or the
  1094. technical notes?
  1095.  
  1096.  
  1097. Thanks in advance.
  1098.  
  1099.  
  1100. - -- 
  1101. J. S. Greenfield                                         greeny@top.cis.syr.edu
  1102. (I like to put 'greeny' here, 
  1103. but my d*mn system wants a 
  1104. *real* name!)                        "What's the difference between an orange?"
  1105.  
  1106. +++++++++++++++++++++++++++
  1107.  
  1108. From: jcav@quads.uchicago.edu (JohnC)
  1109. Date: 21 Jul 92 16:12:51 GMT
  1110. Organization: The Royal Society for Putting Things on Top of Other Things
  1111.  
  1112. In article <1992Jul20.195334.19197@newstand.syr.edu> greeny@top.cis.syr.edu (J. S. Greenfield) writes:
  1113. >
  1114. >What is the standard technique to insure that your application is in the
  1115. >foreground after receiving an 'odoc' event from the finder?
  1116. >
  1117. >I have an application (which does not recieve suspend/resume events) which
  1118.                         ^^^^^ ^^^^ ^^^ ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^
  1119. This is the root of your problem.  If you accept high-level events, you also
  1120. _must_ accept OS events (suspend/resume, etc).
  1121.  
  1122. >brings up a custom get file after receiving an 'odoc' event.  If there are
  1123. >some finder windows open, the get file dialog will occasionally appear
  1124. >*behind* the finder windows, initially.  It then moves to the front, but
  1125. >the dialog window is left empty.
  1126.  
  1127. If you want to be absolutely sure you're in front, you can call
  1128. _SetFrontProcess (I think that's the name) with your own process serial #.
  1129. However, I suspect that if you handle your suspend/resume events by the
  1130. book, the other problems should "factor out".
  1131.  
  1132. - -- 
  1133. John Cavallino                  |  EMail: jcav@midway.uchicago.edu
  1134. University of Chicago Hospitals |         John_Cavallino@uchfm.bsd.uchicago.edu
  1135. Office of Facilities Management | USMail: 5841 S. Maryland Ave, MC 0953
  1136. B0 f++ c+ g++ k s++ e+ h- pv    |         Chicago, IL  60637
  1137.  
  1138. +++++++++++++++++++++++++++
  1139.  
  1140. From: csuley@cs.cornell.edu (Christopher Suley)
  1141. Organization: Cornell Univ. CS Dept, Ithaca NY 14853
  1142. Date: Tue, 21 Jul 1992 17:46:31 GMT
  1143.  
  1144. greeny@top.cis.syr.edu (J. S. Greenfield) writes:
  1145. >
  1146. >What is the standard technique to insure that your application is in the
  1147. >foreground after receiving an 'odoc' event from the finder?
  1148. >
  1149. >I have an application (which does not recieve suspend/resume events) which
  1150. >brings up a custom get file after receiving an 'odoc' event.  If there are
  1151. >some finder windows open, the get file dialog will occasionally appear
  1152. >*behind* the finder windows, initially.  It then moves to the front, but
  1153. >the dialog window is left empty.
  1154. >
  1155. >Can anyone provide me with references to relevant portions of IM or the
  1156. >technical notes?
  1157. >
  1158.  
  1159. In _Macintosh Programming Secrets, 2e_, they call EventAvail 3 times when
  1160. the program starts up to bring it to the front.  They say that this is the
  1161. "standard" way to bring a program to the front under MultiFinder.
  1162. - -- 
  1163. |}-{}-{}-{}-{}-{}-{}-{}-{}-{|
  1164. {} Christopher S. Suley    {}  "do you expect me to talk?"
  1165. {} csuley@cs.cornell.edu   {}  "no, mr. bond, i expect you to die."
  1166. |}-{}-{}-{}-{}-{}-{}-{}-{}-{|
  1167.  
  1168. +++++++++++++++++++++++++++
  1169.  
  1170. From: d88-jwa@dront.nada.kth.se (Jon W{tte)
  1171. Date: 21 Jul 92 21:56:59 GMT
  1172. Organization: Royal Institute of Technology, Stockholm, Sweden
  1173.  
  1174. .uchicago.edu> jcav@quads.uchicago.edu (JohnC) writes:
  1175.  
  1176.    This is the root of your problem.  If you accept high-level events, you also
  1177.    _must_ accept OS events (suspend/resume, etc).
  1178.  
  1179. This is mostly true. You also should make sure that you
  1180. never post Alerts in the background, instead, do something
  1181. like:
  1182.  
  1183.     EnsureInFront ( ) ;
  1184.     Alert ( ... ) ;
  1185.  
  1186. where EnsureInFront returns if you ARE in front, or posts a
  1187. notification and waits until you get into front if you're
  1188. not.
  1189.  
  1190.    If you want to be absolutely sure you're in front, you can call
  1191.    _SetFrontProcess (I think that's the name) with your own process serial #.
  1192.    However, I suspect that if you handle your suspend/resume events by the
  1193.    book, the other problems should "factor out".
  1194.  
  1195. DO not change the front applications forcibly. Don't. No.
  1196. (Well, I have a reason for doing it, but YOU shouldn't :-)
  1197.  
  1198. You should call AEInteractWithUser when you "need" to get
  1199. to the front and can't resort to posting a notification and
  1200. waiting.
  1201.  
  1202. AEInteractWithUser is safe to call even if you're not handling
  1203. an apple event, though, I was told by one of the engineers at
  1204. the Apple Events panel at the WWDC. Cool. So AEInteractWithUser
  1205. is preferred to SetFrontProcess.
  1206.  
  1207. - -- 
  1208.          Jon W{tte, Svartmangatan 18, S-111 29 Stockholm, Sweden
  1209.  
  1210. ### You have the Easy Access virus. This virus may cause strange sounds
  1211. ### and weird keyboard behaviour when you press the shift key repeatedly.
  1212.  
  1213. +++++++++++++++++++++++++++
  1214.  
  1215. From: d88-jwa@dront.nada.kth.se (Jon W{tte)
  1216. Date: 21 Jul 92 22:06:42 GMT
  1217. Organization: Royal Institute of Technology, Stockholm, Sweden
  1218.  
  1219. > csuley@cs.cornell.edu (Christopher Suley) writes:
  1220.  
  1221.    In _Macintosh Programming Secrets, 2e_, they call EventAvail 3 times when
  1222.    the program starts up to bring it to the front.  They say that this is the
  1223.    "standard" way to bring a program to the front under MultiFinder.
  1224.  
  1225.  
  1226. No, it's the standard way of bringing the app to the
  1227. front WHEN BEING LAUNCHED under MultiFinder. Big difference !
  1228. Calling EventAvail will NOT switch layers by itself.
  1229.  
  1230. - -- 
  1231.          Jon W{tte, Svartmangatan 18, S-111 29 Stockholm, Sweden
  1232.  
  1233. ### You have the Easy Access virus. This virus may cause strange sounds
  1234. ### and weird keyboard behaviour when you press the shift key repeatedly.
  1235.  
  1236. +++++++++++++++++++++++++++
  1237.  
  1238. From: jcav@quads.uchicago.edu (JohnC)
  1239. Organization: The Royal Society for Putting Things on Top of Other Things
  1240. Date: Tue, 21 Jul 1992 23:11:24 GMT
  1241.  
  1242. In article <D88-JWA.92Jul21225659@dront.nada.kth.se> d88-jwa@dront.nada.kth.se (Jon W{tte) writes:
  1243. >.uchicago.edu> jcav@quads.uchicago.edu (JohnC) writes:
  1244. >   If you want to be absolutely sure you're in front, you can call
  1245. >   _SetFrontProcess (I think that's the name) with your own process serial #.
  1246. >   However, I suspect that if you handle your suspend/resume events by the
  1247. >   book, the other problems should "factor out".
  1248. >
  1249. >DO not change the front applications forcibly. Don't. No.
  1250. >(Well, I have a reason for doing it, but YOU shouldn't :-)
  1251. >
  1252. >You should call AEInteractWithUser when you "need" to get
  1253. >to the front and can't resort to posting a notification and
  1254. >waiting.
  1255.  
  1256. Point taken.  Mea culpa.
  1257.  
  1258.  
  1259. - -- 
  1260. John Cavallino                  |  EMail: jcav@midway.uchicago.edu
  1261. University of Chicago Hospitals |         John_Cavallino@uchfm.bsd.uchicago.edu
  1262. Office of Facilities Management | USMail: 5841 S. Maryland Ave, MC 0953
  1263. B0 f++ c+ g++ k s++ e+ h- pv    |         Chicago, IL  60637
  1264.  
  1265. +++++++++++++++++++++++++++
  1266.  
  1267. From: csuley@cs.cornell.edu (Christopher Suley)
  1268. Organization: Cornell Univ. CS Dept, Ithaca NY 14853
  1269. Date: Wed, 22 Jul 1992 18:56:14 GMT
  1270.  
  1271. d88-jwa@dront.nada.kth.se (Jon W{tte) writes:
  1272. >> I wrote:
  1273. >
  1274. >   In _Macintosh Programming Secrets, 2e_, they call EventAvail 3 times when
  1275. >   the program starts up to bring it to the front.  They say that this is the
  1276. >   "standard" way to bring a program to the front under MultiFinder.
  1277. >
  1278. >No, it's the standard way of bringing the app to the
  1279. >front WHEN BEING LAUNCHED under MultiFinder. Big difference !
  1280. >Calling EventAvail will NOT switch layers by itself.
  1281. >
  1282.  
  1283. Oops. My bad. I never did well in reading comprehension tests anyway. ;)
  1284.  
  1285. I have a question.  In _Inside Macintosh_, the Memory Manager chapter in
  1286. Volume 2 I think, there is a warning that you shouldn't do anything to a
  1287. handle unless the current zone is the one in which the handle resides.
  1288.  
  1289. I have an application that reads the data out of a handle I store in the
  1290. system heap.  It's never had a problem (the data has always been correct),
  1291. but now I'm concerned.
  1292.  
  1293. It's not a big problem to add GetZone, SetZone( SystemZone() ) calls, but
  1294. I was just wondering why that warning was there.
  1295.  
  1296.  
  1297. - -- 
  1298. |}-{}-{}-{}-{}-{}-{}-{}-{}-{|
  1299. {} Christopher S. Suley    {}  "do you expect me to talk?"
  1300. {} csuley@cs.cornell.edu   {}  "no, mr. bond, i expect you to die."
  1301. |}-{}-{}-{}-{}-{}-{}-{}-{}-{|
  1302.  
  1303. +++++++++++++++++++++++++++
  1304.  
  1305. From: greeny@top.cis.syr.edu (J. S. Greenfield)
  1306. Date: 22 Jul 92 04:34:51 GMT
  1307. Organization: Syracuse University, CIS Dept.
  1308.  
  1309. In article <1992Jul21.161251.7693@midway.uchicago.edu> jcav@midway.uchicago.edu writes:
  1310. >>
  1311. >>What is the standard technique to insure that your application is in the
  1312. >>foreground after receiving an 'odoc' event from the finder?
  1313. >>
  1314. >>I have an application (which does not recieve suspend/resume events) which
  1315. >                        ^^^^^ ^^^^ ^^^ ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^
  1316. >This is the root of your problem.  If you accept high-level events, you also
  1317. >_must_ accept OS events (suspend/resume, etc).
  1318.  
  1319. But this is not correct.  The SIZE resource has a bit to indicate whether
  1320. the application receives suspend/resume events.  Since this application
  1321. does not manipulate any scrap or manipulate any windows (other than modal
  1322. dialogs), it has no need for suspend/resume events.
  1323.  
  1324. Anyway, even if they were sent, I don't mask them out.  They just would not
  1325. produce any response from my application.
  1326.  
  1327.  
  1328. >>brings up a custom get file after receiving an 'odoc' event.  If there are
  1329. >>some finder windows open, the get file dialog will occasionally appear
  1330. >>*behind* the finder windows, initially.  It then moves to the front, but
  1331. >>the dialog window is left empty.
  1332. >
  1333. >If you want to be absolutely sure you're in front, you can call
  1334. >_SetFrontProcess (I think that's the name) with your own process serial #.
  1335. >However, I suspect that if you handle your suspend/resume events by the
  1336. >book, the other problems should "factor out".
  1337.  
  1338. Actually, several individuals pointed me to the proper technique when handling
  1339. apple events, which is to call AEInteractWithUser.  This routine checks both
  1340. the server's and client's specification for allowed interaction in processing
  1341. the event, and will call the notification manager, if necessary, in order to
  1342. request that the user move the server application to the foreground.
  1343.  
  1344. (See IM VI, 6-51 through 6-54.)
  1345.  
  1346. In my case, this is not necessary--the call simply holds up my application
  1347. until it moves to the foreground, as it will normally do since 'odoc' events
  1348. from the Finder allow the server to interact (and the Finder seems to
  1349. undertake to move the server to the foreground, itself).
  1350.  
  1351.  
  1352. - -- 
  1353. J. S. Greenfield                                         greeny@top.cis.syr.edu
  1354. (I like to put 'greeny' here, 
  1355. but my d*mn system wants a 
  1356. *real* name!)                        "What's the difference between an orange?"
  1357.  
  1358. +++++++++++++++++++++++++++
  1359.  
  1360. From: ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  1361. Date: 23 Jul 92 17:36:45 +1200
  1362. Organization: University of Waikato, Hamilton, New Zealand
  1363.  
  1364. In article <1992Jul21.161251.7693@midway.uchicago.edu>, jcav@quads.uchicago.edu (JohnC) writes:
  1365. > If you accept high-level events, you also _must_ accept OS events
  1366. > (suspend/resume, etc).
  1367.  
  1368. I have a counterexample to this claim: Adobe Premiere 1.0. Here are the
  1369. settings of some of its "SIZE" resource bits:
  1370.  
  1371.     accept suspend events: no
  1372.     does activate on FG switch: no
  1373.     32-bit compatible: yes
  1374.     high-level event aware: yes
  1375.  
  1376. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  1377. Computer Services Dept                     fax: +64-7-838-4066
  1378. University of Waikato            electric mail: ldo@waikato.ac.nz
  1379. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00
  1380. Does "future-proof" strike you as a phrase that can be taken two ways?
  1381.  
  1382. +++++++++++++++++++++++++++
  1383.  
  1384. From: jcav@quads.uchicago.edu (JohnC)
  1385. Organization: The Royal Society for Putting Things on Top of Other Things
  1386. Date: Thu, 23 Jul 1992 16:15:26 GMT
  1387.  
  1388. In article <1992Jul23.173645.9578@waikato.ac.nz> ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University) writes:
  1389. >In article <1992Jul21.161251.7693@midway.uchicago.edu>, jcav@quads.uchicago.edu (JohnC) writes:
  1390. >> If you accept high-level events, you also _must_ accept OS events
  1391. >> (suspend/resume, etc).
  1392. >
  1393. >I have a counterexample to this claim: Adobe Premiere 1.0. Here are the
  1394. >settings of some of its "SIZE" resource bits:
  1395. >
  1396. >    accept suspend events: no
  1397. >    does activate on FG switch: no
  1398. >    32-bit compatible: yes
  1399. >    high-level event aware: yes
  1400.  
  1401. I was too emphatic (read: "incorrect") when I said "_must_".  However, I
  1402. still maintain that there's no good reason for an application written after
  1403. 1986 to _not_ accept suspend/resume events.  They're just too easy to support,
  1404. and at the least alleviate the need for the OS to waste machine cycles on the
  1405. infamous Switcher/Multifinder desk accessory switching fakeout.
  1406.  
  1407. Hmm, come to think of it, what I may have been imperfectly recalling was
  1408. the documentation stating that if you set the activate-on-FG bit then you
  1409. should also set the accept-suspend-events bit.
  1410.  
  1411. Anyway...
  1412.  
  1413. - -- 
  1414. John Cavallino                  |  EMail: jcav@midway.uchicago.edu
  1415. University of Chicago Hospitals |         John_Cavallino@uchfm.bsd.uchicago.edu
  1416. Office of Facilities Management | USMail: 5841 S. Maryland Ave, MC 0953
  1417. B0 f++ c+ g++ k s++ e+ h- pv    |         Chicago, IL  60637
  1418.  
  1419. ---------------------------
  1420.  
  1421. End of C.S.M.P. Digest
  1422. **********************
  1423.